<template>
  <div class="page_root" :key="queryUpdateFlag" data-page-name="数据看板" data-page-identification="j_u5hcx663gb">
    <a-spin :spinning="pageLoading.loading" :tip="pageLoading.tip">
      <!-- begin vid_2zvqmyvp4l 自定义模板_z0567iswh7 -->
      <div class="body">
        <div class="top-search">
          <a-row justify="space-between" :gutter="24">
            <a-col :span="6">
              <a-form-item label="区域" :labelCol="{ span: 8 }" :wrapperCol="{ span: 16 }">
                <a-select
                  v-model:value="dataState.filter.areaCodes"
                  :options="dataState.areaList"
                  show-search
                  mode="multiple"
                  allow-clear
                  :max-tag-count="1"
                  placeholder="请选择"
                  :field-names="{ label: 'label', value: 'value' }"
                  :filterOption="
                                        (input, option) => {
                                            return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
                                        }
                                    "
                  @change="getData"
                />
              </a-form-item>
            </a-col>

            <a-col :span="6">
              <a-form-item label="项目总监" :labelCol="{ span: 8 }" :wrapperCol="{ span: 16 }">
                <a-select
                  show-search
                  allow-clear
                  mode="multiple"
                  :max-tag-count="1"
                  :options="dataState.allUser"
                  v-model:value="dataState.filter.projectDirectors"
                  placeholder="请选择"
                  :field-names="{ label: 'name', value: 'name' }"
                  :filter-option="
                                        (input, option) => {
                                            return option.name.toLowerCase().indexOf(input.toLowerCase()) >= 0
                                        }
                                    "
                  @change="getData"
                />
              </a-form-item>
            </a-col>
            <a-col :span="6">
              <a-form-item label="项目经理" :labelCol="{ span: 8 }" :wrapperCol="{ span: 16 }">
                <a-select
                  show-search
                  allow-clear
                  :max-tag-count="1"
                  :options="dataState.allUser"
                  v-model:value="dataState.filter.pmNames"
                  placeholder="请选择"
                  :field-names="{ label: 'name', value: 'name' }"
                  mode="multiple"
                  :filter-option="
                                        (input, option) => {
                                            return option.name.toLowerCase().indexOf(input.toLowerCase()) >= 0
                                        }
                                    "
                  @change="getData"
                />
              </a-form-item>
            </a-col>
            <a-col :span="6">
              <a-form-item label="PMO" :labelCol="{ span: 8 }" :wrapperCol="{ span: 16 }">
                <a-select
                  show-search
                  allow-clear
                  :options="dataState.allUser"
                  v-model:value="dataState.filter.pmoName"
                  placeholder="请选择"
                  :field-names="{ label: 'name', value: 'name' }"
                  :filter-option="
                                        (input, option) => {
                                            return option.name.toLowerCase().indexOf(input.toLowerCase()) >= 0
                                        }
                                    "
                  @change="getData"
                />
              </a-form-item>
            </a-col>
          </a-row>
          <a-row justify="space-between" :gutter="24">
            <a-col :span="6">
              <a-form-item label="项目阶段" :labelCol="{ span: 8 }" :wrapperCol="{ span: 16 }">
                <a-select
                  allow-clear
                  show-search
                  mode="multiple"
                  :options="dataState.milepostList"
                  placeholder="请选择"
                  v-model:value="dataState.filter.milepostNames"
                  :field-names="{ label: 'itemName', value: 'itemName' }"
                  @change="getData"
                />
              </a-form-item>
            </a-col>
            <a-col :span="6">
              <a-form-item label="自学习宽表天数" :labelCol="{ span: 8 }" :wrapperCol="{ span: 16 }">
                <a-select allow-clear :options="dataState.zxxSelect" placeholder="请选择" v-model:value="dataState.filter.selfLearningDaysCode" @change="getData" />
              </a-form-item>
            </a-col>
            <a-col :span="6">
              <a-form-item label="自学习宽表列数" :labelCol="{ span: 8 }" :wrapperCol="{ span: 16 }">
                <a-select allow-clear :options="dataState.zxxSelect1" placeholder="请选择" v-model:value="dataState.filter.selfLearningColumnsCode" @change="getData" />
              </a-form-item>
            </a-col>
            <a-col :span="6">
              <a-form-item label="是否验收产线品种" :labelCol="{ span: 8 }" :wrapperCol="{ span: 16 }">
                <a-select
                  allow-clear
                  :options="[
                                        {
                                            label: '是',
                                            value: '是'
                                        },
                                        {
                                            label: '否',
                                            value: '否'
                                        }
                                    ]"
                  placeholder="请选择"
                  v-model:value="dataState.filter.acceptance"
                  @change="getData"
                />
              </a-form-item>
            </a-col>
          </a-row>
          <a-row :gutter="24">
            <a-col :span="6">
              <a-form-item label="全品工厂培训状态" :labelCol="{ span: 8 }" :wrapperCol="{ span: 16 }">
                <a-select
                  allow-clear
                  :options="[
                                        {
                                            label: '是',
                                            value: '是'
                                        },
                                        {
                                            label: '否',
                                            value: '否'
                                        }
                                    ]"
                  placeholder="请选择"
                  v-model:value="dataState.filter.factoryTrainingStatus"
                  @change="getData"
                />
              </a-form-item>
            </a-col>
            <!--                        <a-col :span="6">-->
            <!--                            <a-form-item label="熟料/水泥建模状态" :labelCol="{ span: 8 }" :wrapperCol="{ span: 16 }">-->
            <!--                                <a-select-->
            <!--                                    allow-clear-->
            <!--                                    :options="[-->
            <!--                                        {-->
            <!--                                            label: '是',-->
            <!--                                            value: '是'-->
            <!--                                        },-->
            <!--                                        {-->
            <!--                                            label: '否',-->
            <!--                                            value: '否'-->
            <!--                                        }-->
            <!--                                    ]"-->
            <!--                                    placeholder="请选择"-->
            <!--                                    v-model:value="dataState.filter.modelingStatus"-->
            <!--                                    @change="getData"-->
            <!--                                />-->
            <!--                            </a-form-item>-->
            <!--                        </a-col>-->
            <a-col :span="6" offset="12" style="display: flex; justify-content: end">
              <a-button @click="resetData" type="primary">重置</a-button>
            </a-col>
          </a-row>
        </div>
        <div class="kb-table">
          <div class="kb-title">
            <div class="kb-title-left"> 数据看板 </div>
            <a-button type="primary" @click="handleExport" :loading="dataState.exportLoading">导出</a-button>
          </div>
          <a-table bordered :columns="columns" :data-source="dataState.tableData" :scroll="{ x: 'max-content', y: 420 }" :loading="dataState.tableLoading" :pagination="false">
            <template #bodyCell="{ record, text, column, index }">
              <template v-if="column.dataIndex === 'count'">
                {{ index + 1 }}
              </template>
            </template>
          </a-table>
        </div>
      </div>
      <!-- end vid_2zvqmyvp4l 自定义模板_z0567iswh7 -->
    </a-spin>
  </div>
</template>
<script setup lang="tsx">
  import {
      h, ref, reactive, toRaw, markRaw, watch, computed,
      onBeforeMount, onMounted, onBeforeUnmount, onUnmounted, onActivated, onDeactivated
    } from "vue";
    import { useRoute, useRouter } from 'vue-router';
    const router = useRouter();
    const route = useRoute();
    import { get, post, put, del, request, requestWithHeaders } from '@/utils/http/Axios';
    import { cloneDeep, localGet, merge, getDifferenceArray, traversalTreeStructure, checkCaseCondition, renderStringInTemplate, handleBreadcrumbJump, throttle, permission, getComponentParamsValue } from '@/utils/index';
    import { isNullOrEmpty, isEmptyArr, isNullOrUnDef, isContained, isArray, isEmpty, isObject } from '@/utils/is';
    import dayjs from 'dayjs';
    import { getPagePcChartsDataSourceConvert } from '@/utils/chart';
    import { message, notification, Modal } from 'ant-design-vue'
    import { propertyFormatByNumber, propertyFormatByPercentage, propertyFormatByDate, parseSubFromDataList } from '@/utils/format';
    import colorTheme from '@/design/custom-theme.json';
    
    import UserTableRecords from '@/model/UserTableRecords';
    import { getAppBaseUrl } from '@/utils/index';
    import { sendToken } from "@/hooks/useIframeToken";
    import { useSystemStore } from "@/store/modules/system";
    const systemStore = useSystemStore();
    



      // 获取传入的流程ID和组件参数
      const props = defineProps({
            'processInstanceId': {
            type: [String,Number,Boolean],
            default: undefined,
        },
      })
      const immediateWatch = (source, callback) => {
        watch(source, callback, {deep: true,immediate: true })
      }



  /* -------------------------- 属性定义 -------------------------- */

      const setTimeOutList = [];
      const pageLoading = reactive({
        loading: false,
        tip: undefined
      });
      const authInfo = localGet('app-user-store');




      // 处理校验
      const setSubFormName =(parentInfo, name)=>{
        return [parentInfo.parents, parentInfo.cycleIndex, name];
      }


  /* ========================== 属性定义 ========================== */


  /* -------------------------- 元素数据引用 -------------------------- */


  /* ========================== 元素数据引用 ========================== */


  /* -------------------------- 页面数据 -------------------------- */


  /* ========================== 页面数据 ========================== */



  /* -------------------------- 响应 -------------------------- */

  /* ========================== 响应 ========================== */


  /* -------------------------- 函数 -------------------------- */

  /* ========================== 函数 ========================== */


  /* -------------------------- 页面参数 -------------------------- */

    const pageParameter_state = reactive({
        'processInstanceId': props.processInstanceId ?? route.query.processInstanceId,
    })

  /* ========================== 页面参数 ========================== */


  /* -------------------------- 组件事件处理方法 -------------------------- */

    // ---------------------------- 组件数据同步 ----------------------------

    // ============================ 组件数据同步 ============================


  /* ========================== 组件事件处理方法 ========================== */


  /* -------------------------- 生命周期 -------------------------- */
  // 用于参数变更后重新执行自定义指令
      const queryUpdateFlag = ref(0);
      onMounted(() => { ;

    });

    onUnmounted(() => {
      // 销毁定时器
      setTimeOutList.forEach(({ repeat, timer }) => {
        repeat ?  clearInterval(timer): clearTimeout(timer);
      });
    });

  /* ========================== 生命周期 ========================== */


  /* -------------------------- 数据关联处理 -------------------------- */





  /* -------------------------- 表单数据同步 -------------------------- */
  /* ========================== 表单数据同步 ========================== */

  /* ========================== 数据关联处理 ========================== */


  /* -------------------------- 不同组件自定义的处理逻辑 -------------------------- */

  /* ========================== 不同组件自定义的处理逻辑 ========================== */


  // ================================定制化逻辑========================================
  onMounted(() => {
          getAreaList()
          getAllUser()
          getMilepostList()
          getDictionary()
          getData()
      })
      const dataState = reactive({
          filter: {
              areaCodes: undefined,
              projectDirectors: undefined,
              pmNames: undefined,
              pmoName: undefined,
              milepostNames: undefined,
              selfLearningDaysCode: undefined,
              selfLearningColumnsCode: undefined,
              acceptance: undefined,
              factoryTrainingStatus: undefined,
              modelingStatus: undefined
          },
          customSort: { 'sortDirection': 'ASC', 'filed': 'AREA_PROJECT' },
          exportLoading: false,
          areaList: [],
          zxxSelect: [],
          zxxSelect1: [],
          allUser: [],
          milepostList: [],
          tableData: [],
          modalForm: {},
          tableLoading: false
      })
      const columns = ref([
          {
              title: '序号',
              dataIndex: 'count',
              align: 'center',
              width: 80
          },
          {
              title: '区域',
              dataIndex: 'areaName',
              align: 'center',
              width: 120,
              customCell: ({ areaRowSpan, projectRowSpan }) => {
                  return {
                      rowSpan: areaRowSpan
                  }
              }
          },
          {
              title: '工厂名称',
              dataIndex: 'projectShortName',
              align: 'center',
              width: 180,
              customCell: ({ areaRowSpan, projectRowSpan }) => {
                  return {
                      rowSpan: projectRowSpan
                  }
              }
          },
          {
              title: '项目总监',
              dataIndex: 'projectDirector',
              align: 'center',
              width: 120,
              customCell: ({ areaRowSpan, projectRowSpan }) => {
                  return {
                      rowSpan: projectRowSpan
                  }
              }
          },
          {
              title: '项目经理',
              dataIndex: 'pmName',
              align: 'center',
              width: 120,
              customCell: ({ areaRowSpan, projectRowSpan }) => {
                  return {
                      rowSpan: projectRowSpan
                  }
              }
          },
          {
              title: 'PMO',
              dataIndex: 'pmoName',
              align: 'center',
              width: 140,
              customCell: ({ areaRowSpan, projectRowSpan }) => {
                  return {
                      rowSpan: projectRowSpan
                  }
              }
          },
          {
              title: '项目阶段',
              dataIndex: 'milepostName',
              align: 'center',
              width: 160,
              customCell: ({ areaRowSpan, projectRowSpan }) => {
                  return {
                      rowSpan: projectRowSpan
                  }
              }
          },
          {
              title: '项目状态',
              dataIndex: 'projectStatus',
              align: 'center',
              width: 160,
              customCell: ({ areaRowSpan, projectRowSpan }) => {
                  return {
                      rowSpan: projectRowSpan
                  }
              }
          },
          {
              title: '熟料建模数量',
              dataIndex: 'clinkerModelingNum',
              align: 'center',
              width: 160,
              customCell: ({ areaRowSpan, projectRowSpan }) => {
                  return {
                      rowSpan: projectRowSpan
                  }
              }
          },
          {
              title: '已完成熟料建模数量',
              dataIndex: 'finishedClinkerModelingNum',
              align: 'center',
              width: 160,
              customCell: ({ areaRowSpan, projectRowSpan }) => {
                  return {
                      rowSpan: projectRowSpan
                  }
              }
          },
          {
              title: '水泥建模数量',
              dataIndex: 'cementModelingNum',
              align: 'center',
              width: 160,
              customCell: ({ areaRowSpan, projectRowSpan }) => {
                  return {
                      rowSpan: projectRowSpan
                  }
              }
          },
          {
              title: '已完成水泥建模数量',
              dataIndex: 'finishedCementModelingNum',
              align: 'center',
              width: 160,
              customCell: ({ areaRowSpan, projectRowSpan }) => {
                  return {
                      rowSpan: projectRowSpan
                  }
              }
          },
          {
              title: '全品工厂培训状态',
              dataIndex: 'factoryTrainingStatus',
              align: 'center',
              width: 200,
              customCell: ({ areaRowSpan, projectRowSpan }) => {
                  return {
                      rowSpan: projectRowSpan
                  }
              }
          },
          // { title: '任务类型', dataIndex: 'taskType', align: 'center', width: 150 },
          { title: '窑/水泥磨', dataIndex: 'kilnOrCement', align: 'center', width: 150 },
          { title: '熟料/水泥品种', dataIndex: 'clinkerOrCementType', align: 'center', width: 160 },
          { title: '熟料/水泥建模状态', dataIndex: 'modelingStatus', align: 'center', width: 160 },
          { title: '是否验收产线品种', dataIndex: 'acceptance', align: 'center', width: 180 },

          {
              title: '自学习数据',
              children: [
                  {
                      title: '宽表天数',
                      dataIndex: 'clinkerDays',
                      align: 'center',
                      width: 140,
                      sorter: (a, b) => a.clinkerDays - b.clinkerDays
                  },
                  {
                      title: '宽表列数',
                      dataIndex: 'clinkerDcsNums',
                      align: 'center',
                      width: 140,
                      sorter: (a, b) => a.clinkerDcsNums - b.clinkerDcsNums
                  },
                  {
                      title: '自学习条数',
                      dataIndex: 'studyNums',
                      align: 'center',
                      width: 140,
                      sorter: (a, b) => a.studyNums - b.studyNums
                  }
              ]
          },

          {
              title: '水泥',
              children: [
                  {
                      title: '3天强度预测合格率',
                      dataIndex: 'cement3dRate',
                      align: 'center',
                      width: 180,
                      sorter: (a, b) => a.cement3dRate - b.cement3dRate
                  },
                  {
                      title: '28天强度预测合格率',
                      dataIndex: 'cement28dRate',
                      align: 'center',
                      width: 180,
                      sorter: (a, b) => a.cement28dRate - b.cement28dRate
                  }
              ]
          },

          {
              title: '熟料',
              children: [
                  {
                      title: '3天强度预测合格率',
                      dataIndex: 'clinker3dRate',
                      align: 'center',
                      width: 180,
                      sorter: (a, b) => a.clinker3dRate - b.clinker3dRate
                  },
                  {
                      title: '28天强度预测合格率',
                      dataIndex: 'clinker28dRate',
                      align: 'center',
                      width: 180,
                      sorter: (a, b) => a.clinker28dRate - b.clinker28dRate
                  }
              ]
          }
      ])

      // 区域
      function getAreaList() {
          get('/solution-ppm/api/v2/built-in-system-ppm/work_order/area_info').then(data => {
              if (data.code !== 200) {
                  message.error(data.message)
                  return
              }
              dataState.areaList = data.data.map(item => {
                  return {
                      label: item.areaName,
                      value: item.areaCode
                  }
              })
          })
      }
      //     角色
      function getAllUser() {
          get('/solution-ppm/api/v2/built-in-system-ppm/pmgf/get/allUser').then(data => {
              if (data.code !== 200) {
                  message.error(data.message)
                  return
              }
              dataState.allUser = data.data.userDtoList
          })
      }
      // 项目阶段
      function getMilepostList() {
          get('/solution-ppm/api/v2/built-in-system-ppm/dictionary/search/1001.1000').then(data => {
              dataState.milepostList = data.data
          })
      }
      function getDictionary() {
          get('/solution-ppm/api/v2/built-in-system-ppm/dictionary/search/ZXX.KBTS').then(data => {
              dataState.zxxSelect = data.data.map(item => {
                  return {
                      label: item.itemName,
                      value: item.itemCode
                  }
              })
          })
          get('/solution-ppm/api/v2/built-in-system-ppm/dictionary/search/ZXX.KBLS').then(data => {
              dataState.zxxSelect1 = data.data.map(item => {
                  return {
                      label: item.itemName,
                      value: item.itemCode
                  }
              })
          })
      }
      function getData() {
          dataState.tableLoading = true
          post('/solution-ppm/api/v2/built-in-system-ppm/data_dashboard/list', {
              ...dataState.filter,
              customSort: dataState.customSort
          })
              .then(data => {
                  if (data.code !== 200) {
                      message.error(data.message)
                      dataState.tableData = []
                      return
                  }
                  dataState.tableData = groupData(data.data)
              })
              .finally(() => {
                  dataState.tableLoading = false
              })
      }
      function resetData() {
          dataState.filter = {
              areaCodes: undefined, //区域
              projectDirectors: undefined, //项目总监
              pmNames: undefined, //项目经理
              pmoName: undefined, //pmo
              milepostNames: undefined, //项目阶段
              selfLearningDaysCode: undefined, //自学习天数
              selfLearningColumnsCode: undefined, //自学习列数
              acceptance: undefined, //是否验收产品线
              factoryTrainingStatus: undefined, //全品工厂培训状态
              modelingStatus: undefined //熟料/水泥建模状态
          }
          getData()
      }
      function handleExport() {
          dataState.exportLoading = true
          post(
              '/solution-ppm/api/v2/built-in-system-ppm/data_dashboard/exportDataDashboardList',
              { ...dataState.filter, customSort: dataState.customSort },
              {
                  responseType: 'arraybuffer'
              }
          ).then(data => {
              downloadExcel(data, '数据看板.xlsx')
              dataState.exportLoading = false
          })
      }
      function downloadExcel(response, name) {
          const blob = new Blob([response], {
              type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8'
          })
          const downloadElement = document.createElement('a')
          const href = window.URL.createObjectURL(blob) // 创建下载的链接
          downloadElement.href = href
          downloadElement.download = name // 下载后文件名
          document.body.appendChild(downloadElement)
          downloadElement.click() // 点击下载
          document.body.removeChild(downloadElement) // 下载完成移除元素
          window.URL.revokeObjectURL(href)
          return href
      }
      function groupData(data) {
          let areaName = ''
          let projectShortName = ''

          return data.map((item, index) => {
              // 处理 areaName 合并
              if (areaName !== item.areaName) {
                  areaName = item.areaName
                  let areaRowSpan = 0

                  for (let i = index; i < data.length; i++) {
                      if (data[i].areaName === areaName) {
                          areaRowSpan++
                      } else {
                          break
                      }
                  }
                  item.areaRowSpan = areaRowSpan
              } else {
                  item.areaRowSpan = 0
              }

              // 处理 projectShortName 合并（在同一个 areaName 范围内）
              if (projectShortName !== item.projectShortName || item.areaRowSpan > 0) {
                  projectShortName = item.projectShortName
                  let projectRowSpan = 0

                  for (let i = index; i < data.length; i++) {
                      if (data[i].areaName === areaName && data[i].projectShortName === projectShortName) {
                          projectRowSpan++
                      } else {
                          break
                      }
                  }
                  item.projectRowSpan = projectRowSpan
              } else {
                  item.projectRowSpan = 0
              }

              return item
          })
      }
</script>
<style lang="less" scoped>
  .page_root {
  width: 100%;
  height: 100%;
  overflow: auto;
  }
  .page_root :deep(.@{ant-prefix}-spin-nested-loading),
  .page_root :deep(.@{ant-prefix}-spin-container)
   {
      height: 100%;
  }
  .page_root :deep(.@{ant-prefix}-spin-container .@{ant-prefix}-table-wrapper)
   {
      display: flex;
      flex-flow: column nowrap;
      justify-content: flex-start;
  }
  .page_root :deep(.@{ant-prefix}-table)
   {
    flex: auto;
    overflow: auto;
  }
  .table-moreBtn_down {
    overflow: hidden; white-space: nowrap; text-overflow: ellipsis; width: 100px;
  }

  .table-moreBtn_menu :deep(.table-moreBtn_menu-item):hover {
    background: #ebf1ff;
  }

  /*  表格树结构样式处理，展开按钮层级增加*/
  :deep(.@{ant-prefix}-table-row-expand-icon) {
    z-index: 1;
  }
  /*  表格树结构 由于每个表格项采用自定义组件，使用绝对定位布局，开启树结构导致显示异常，暂时使用层级定位位置 */
  :deep(.@{ant-prefix}-table-row-level-1 .@{ant-prefix}-table-cell-with-append .cell-wrapper-left) {
    left: 15px !important;
    width: calc(100% - 15px);
  }
  :deep(.@{ant-prefix}-table-row-level-2 .@{ant-prefix}-table-cell-with-append .cell-wrapper-left) {
    left: 30px !important;
    width: calc(100% - 30px);
  }
  :deep(.@{ant-prefix}-table-row-level-3 .@{ant-prefix}-table-cell-with-append .cell-wrapper-left) {
    left: 45px !important;
    width: calc(100% - 45px);
  }
  :deep(.@{ant-prefix}-table-row-level-4 .@{ant-prefix}-table-cell-with-append .cell-wrapper-left) {
    left: 60px !important;
    width: calc(100% - 60px);
  }

  /* 穿梭框改变默认样式，为根据组件样式控制左右栏宽度。 */
  :deep(.@{ant-prefix}-transfer-list)
   {
      height: 100%;
      width: 50%;
  }


  /*看板*/
      .top-search {
          margin-bottom: 14px;
          padding: 16px 24px;
          padding-bottom: 0;
          background-color: #fff;
      }
      .kb-box {
          padding: 16px 24px;
          background-color: #fff;
          height: 100%;
      }
      .body {
          height: 100%;
      }
      .kb-title {
          display: flex;
          justify-content: space-between;
          align-items: center;
          margin-bottom: 16px;
          .kb-title-left {
              font-size: 16px;
              color: #262626;
              letter-spacing: 0;
              font-weight: 600;
              line-height: 16px;
              padding-left: 8px;
              border-left: 4px solid #3875ff;
              height: 16px;
          }
      }
      .kb-table {
          padding: 16px 24px;
          background-color: #fff;
          height: 100%;
      }
      .kb-table:deep(.@{ant-prefix}-table-thead) > tr > th {
          background: #3875ff;
          color: #fff;
          font-weight: 600;
          padding: 8px 16px;
          border-right: 1px solid #d9d9d9 !important;
          position: relative;
      }
      .kb-table :deep(.@{ant-prefix}-table-tbody) tr > td {
          font-size: 14px;
          font-family: arial, helvetica, 'microsoft yahei';
          font-weight: 400;
          color: #262626;
          border-bottom: 1px solid #d9d9d9;
          padding: 8px 4px;
          word-break: break-all;
      }
      .page_root {
          overflow: hidden;
      }
      /*看板*/
</style>